package bz.ziro.kanbe.logic;

import java.io.StringWriter;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import com.google.appengine.api.datastore.Key;

import bz.ziro.kanbe.bean.FileData;
import bz.ziro.kanbe.bean.ListData;
import bz.ziro.kanbe.bean.PageData;
import bz.ziro.kanbe.bean.ParamData;
import bz.ziro.kanbe.bean.SiteData;
import bz.ziro.kanbe.bean.TextData;
import bz.ziro.kanbe.dao.PageDao;
import bz.ziro.kanbe.dao.SiteDao;
import bz.ziro.kanbe.model.Page;
import bz.ziro.kanbe.model.Site;
import bz.ziro.kanbe.model.TemplateBrowser;

/**
 * 表示ページ作成ロジック
 * @author Administrator
 */
public class HtmlLogic {

    //@SuppressWarnings("unused")
    private static final Logger logger = Logger.getLogger(HtmlLogic.class.getName());

    /**
     * サイトのデータを作成する
     * @param site
     * @param page
     * @return
     */
    private static VelocityContext createContext(Site site, Page page,ParamData param) {

        VelocityContext context = new VelocityContext();

        //サイト用のデータ作成
        context.put("site", new SiteData(site));
        //ページ用のデータを作成
        PageData pageData = new PageData(page,param);
        context.put("page", pageData);

        //メールを使用する場合
 
        //テキストデータを設定
        TextData textData = new TextData();
        context.put("text",textData);

        //ファイルデータを作成
        FileData fileData = new FileData();
        context.put("file",fileData);

        //リストを設定
        context.put("list", new ListData());

        return context;
    }


    /**
     * サイト作成ロジック
     * @param pageNum 
     * @param keyBuf 指定したページID
     * @param testFlag テスト表示有無
     * @param request リクエスト
     * @param writer HTML(out)
     * @return フォワード先
     */
	public static String createHtml(String siteKey,ParamData param,
			                        HttpServletRequest request,StringWriter writer) {
		//Templateの初期化を行う
		TemplateLogic.init();
        //初回時だった場合にデータを作成
        FirstLogic.insertFirstSiteData();

        //使用するサイトを取得
        Site site = null;
        //指定が存在しない場合(本物)
        if ( siteKey == null ) {
        	//公開しているものを取得
        	site = SiteDao.findPublish();
        } else {
        	//指定されたサイトを取得
        	site = SiteDao.find(Long.valueOf(siteKey));
        }
        if ( site == null ) {
            return "privateSite.jsp";
        }
       
        //ページのIDを取得
        Long pageKey = param.getId();

        Page page = null;
        //ID指定がない場合はトップとみなして処理
        if ( pageKey == null ) {
        	//最上位のページを取得
        	page = PageDao.findRootPage(site);
        } else {
            //指定されたページを取得
            page = PageDao.find(site.getKey().getId(),pageKey);
        }

        //Velocityデータを生成
        VelocityContext context = HtmlLogic.createContext(site,page,param);

        //サイトテンプレート
        Key siteTemplateKey = page.getSiteTemplateKey();
        //ページテンプレート
        Key pageTemplateKey = page.getPageTemplateKey();

        //サイト用の検索
        TemplateBrowser siteBrow = BrowserLogic.findAgentBrowser(siteTemplateKey, request);
        //存在しない場合
        if ( siteBrow == null ) {
            logger.warning("サイトブラウザ指定がないよー");
            return "errorSite.jsp";
        }

        //ページテンプレートに埋め込んで、テンプレートの型にいれこむ
        String templateData = siteBrow.getTemplateData();

        //テンプレート設定の位置
        int templateIdx = templateData.indexOf("${pageTemplate}");
        //存在した場合
        if ( templateIdx != -1 ) {
            //ページ用の検索
            TemplateBrowser pageBrow = BrowserLogic.findAgentBrowser(pageTemplateKey, request);
            //存在しない場合
            if ( pageBrow == null ) {
                logger.warning("ページブラウザ指定がないよー");
                return "errorSite.jsp";
            }
            String mae   = templateData.substring(0, templateIdx-1);
            String usiro = templateData.substring(templateIdx + 15);
        	//テンプレートデータ
        	templateData = mae + pageBrow.getTemplateData() + usiro;
        }

        try {
            //解析する
            Velocity.evaluate(context, writer, "kanbeSite", templateData);
        } catch ( Exception ex ) {
            logger.severe(ex.toString());
        }
        
        String forward = "index.jsp";
        if ( siteKey != null ) {
        	forward = "test.jsp";
        }
		return forward;
	}

	/**
	 * ドメインを取得
	 * @param request
	 * @return
	 */
	public static String getDomain(HttpServletRequest request) {
    	//URLを取得
    	StringBuffer urlBuf = request.getRequestURL();
    	//リクエストを取得
    	String uri = request.getRequestURI();
    	String url = urlBuf.toString();

    	//検索を行いドメインのみを抜き出す
    	int idx = url.indexOf(uri);
    	url = url.substring(0, idx);
    	
    	return url;
	}
}
